package com.nf.mvc.cors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * <h3>spring 框架中的跨域处理</h3>
 * <p>spring中主要是CrossOrigin注解，CorsConfiguration，CorsProcessor几个类型合作来处理跨域问题</p>
 * <p>spring的跨域逻辑主要是在AbstractHandlerMapping的getHandler方法中实现的,
 * 当是"预检"请求（preflight）时，就把执行链中的Handler换成PreFlightHandler，
 * 如果不是预请求就把CorsInterceptor拦截器添加为拦截链的第一个（不改动原来的handler）</p>
 * <p>PreFlightHandler与CorsInterceptor的跨域处理都是交给CorsProcessor接口的实现类去处理的</p>
 * <h3>参考资料</h3>
 * <a href="https://howtodoinjava.com/java/servlets/java-cors-filter-example/">cors filter写法</a>
 */
public interface CorsProcessor {
    /**
     * 这个方法类似于spring中CorsProcessor接口的processRequest，但返回值的含义有变化
     * 主要是因为预检请求需要提前响应，快点结束方法的执行，
     * 但我又不想用一个类似于PreFlightHandler的方式来处理，
     * 所以DispatcherService的service方法就可以通过方法返回逻辑值来决定是否提前return以结束方法的执行
     *
     * @param req    请求对象
     * @param resp   响应对象
     * @param config 跨域配置对象
     * @return false表示不需要进行后续的处理，true表示还需要
     */
    boolean processCors(HttpServletRequest req, HttpServletResponse resp, CorsConfiguration config) throws IOException;
}
